#include "StringHash.h"
#include <string>
#include <assert.h>

namespace ECS
{
	namespace impl
	{
		typedef unsigned int (*StringHasher)(const char*);
	}

	unsigned int getDynamicHash( const char* str )
	{
		static const impl::StringHasher hashers[] = {nullptr, nullptr, 
			&impl::getStaticStringHash2,
			&impl::getStaticStringHash3,
			&impl::getStaticStringHash4,
			&impl::getStaticStringHash5,
			&impl::getStaticStringHash6,
			&impl::getStaticStringHash7,
			&impl::getStaticStringHash8,
			&impl::getStaticStringHash9,
			&impl::getStaticStringHash10,
			&impl::getStaticStringHash11,
			&impl::getStaticStringHash12,
			&impl::getStaticStringHash13,
			&impl::getStaticStringHash14,
			&impl::getStaticStringHash15,
			&impl::getStaticStringHash16,
			&impl::getStaticStringHash17,
			&impl::getStaticStringHash18,
			&impl::getStaticStringHash19,
			&impl::getStaticStringHash20,
			&impl::getStaticStringHash21,
			&impl::getStaticStringHash22,
			&impl::getStaticStringHash23,
			&impl::getStaticStringHash24,
			&impl::getStaticStringHash25,
			&impl::getStaticStringHash26,
			&impl::getStaticStringHash27,
			&impl::getStaticStringHash28,
			&impl::getStaticStringHash29,
			&impl::getStaticStringHash30};

		auto len = strlen(str);

		assert (len >= 1 && len <= 29);

		return hashers[len + 1](str);
	}

}
